SQL - Uma Web App VB NET com MS SQL Server
Auxiliares - Módulo MSSQLSRV
Imports System.Data.SqlClient
Imports System.Web.Configuration
'System.Web.HttpContext.Current.Response.End()
'string str = "../Erro.aspx?msg='" + ex.Message + "'"
'System.Web.HttpContext.Current.Response.Redirect(str,true)
'return null
Module mdlMSSQLSRV
'notas sobre os strings de conexão com o banco de dados
'eles podem ser definidos em diversos locais por motivos de segurança
'
'Se for inserir no web config seve ser colocado logo após </appSettings>
'name é o nome da conexao
'connectionString é o string de conexão
'<connectionStrings>
'<add name = "ApplicationServices" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnetdb.mdf;User Instance=true" providerName="System.Data.SqlClient"/>
'<add name = "SQLPROD" connectionString="Server=Servidor; Database=BaseDados; UID=Usuario;PWD=Senha" providerName="System.Data.SqlClient"/>
'<add name = "SQLTESTES" connectionString="Server=Servidor; Database=BaseDados; UID=Usuario;PWD=Senha" providerName="System.Data.SqlClient"/>
'<add name = "SQLCON3" connectionString="Server=Servidor; Database=BaseDados; UID=Usuario;PWD=Senha" providerName="System.Data.SqlClient"/>
'<add name = "SQLCON4" connectionString="Server=Servidor; Database=BaseDados; UID=Usuario;PWD=Senha" providerName="System.Data.SqlClient"/>
'<add name = "ExcelCon" connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|teste.xls;Extended Properties=Excel 12.0"/>
'</connectionStrings>
'para ler o string de conexão da session
'Public cnstr As String = System.Web.HttpContext.Current.Session("CONEXAO").ToString()
Public cnstr As String = "" 'string de conexão com o banco de dados
Public cncn As New SqlConnection 'conexão com o banco de dados
Public Erro As String = "" 'troca de mensagens de erro
''' <summary>
''' Definindo o string de conexão com o banco de dados que dependente da url de acesso do site
''' </summary>
Public Function ObtemStrConexao() As String
Dim cnstr As String = ""
'p=produção
Dim srvp As String = ""
Dim bdp As String = ""
Dim usup As String = ""
Dim senhap As String = ""
't=teste
Dim srvt As String = "srvxeon1\MSSQLSDRV"
Dim bdt As String = "dbagenda"
Dim usut As String = "usucomum"
Dim senhat As String = "Escola@1"
'definindo o acesso ao bd pela url do site - salvando na session
Dim strurl As String = My.Request.Url.AbsoluteUri
strurl = strurl.ToUpper()
If ((strurl.IndexOf("LOCALHOST") <> 0) Or (strurl.IndexOf("TEST") <> 0)) Then
'Servidores Local ou de teste
System.Web.HttpContext.Current.Session.Add("SERVIDOR", "TESTES")
'lendo do web config
'cnstr = WebConfigurationManager.ConnectionStrings("SQLTESTES").ConnectionString
'definindo o str conexão aqui mesmo
'cnstr = "Server=" + srvt + ";Database=" + bdt + ";User ID=" + usut + ";Password=" + senhat + "/>"
'cnstr = "Data Source=" + srvt + ";Initial Catalog=" + bdt + ";Integrated Security=true;"
cnstr = "Data Source = " + srvt + ";Initial Catalog=" + bdt + "; User ID=" + usut + "; Password=" + senhat
System.Web.HttpContext.Current.Session.Add("CONEXAO", cnstr)
Else
'Servidor de produção
System.Web.HttpContext.Current.Session.Add("SERVIDOR", "PRODUCAO")
'lendo do web config
'cnstr = WebConfigurationManager.ConnectionStrings("SQLPROD").ConnectionString
'definindo o str conexão aqui mesmo
System.Web.HttpContext.Current.Session.Add("CONEXAO", cnstr)
End If
Return cnstr
End Function
''' <summary>
''' conecta com o banco de dados - define str conexão
''' </summary>
Public Sub MS_SQL_SRV_CON()
Erro = ""
Try
If (cncn.State = ConnectionState.Closed) Then
'cnstr = Session("CONEXAO").ToString()
cnstr = ObtemStrConexao()
cncn.ConnectionString = cnstr
cncn.Open()
Return
End If
Catch ex As Exception
Erro = ex.Message
End Try
End Sub
''' <summary>
'''faz a pesquisa e retorna um DataSet
''' </summary>
Public Function MS_SQL_SRV_DS(query As String) As DataSet
Erro = ""
Try
MS_SQL_SRV_CON()
Dim da As New SqlDataAdapter(query, cncn)
Dim ds As New DataSet
da.Fill(ds)
cncn.Close()
Return ds
Catch ex As SqlException
Erro = ex.Message
Return Nothing
'Throw ex
End Try
End Function
''' <summary>
'''executa um sql que não retorna nada
''' </summary>
Public Sub MS_SQL_SRV_EX(query As String)
Erro = ""
Try
MS_SQL_SRV_CON()
Dim cmd = New SqlCommand(query, cncn)
cmd.CommandTimeout = 20000
cmd.ExecuteNonQuery()
cncn.Close()
Catch ex As Exception
Erro = ex.Message
'Throw ex
End Try
End Sub
''' <summary>
'''executa um sql que retorna um inteiro
''' </summary>
Public Function MS_SQL_SRV_INT(query As String) As Integer
Erro = ""
Try
MS_SQL_SRV_CON()
Dim cmd = New SqlCommand(query, cncn)
cmd.CommandText = query
Return cmd.ExecuteScalar()
Catch ex As Exception
Erro = ex.Message
Return Nothing 'erro
'Throw ex
End Try
End Function
''' <summary>
''' executa um sql que retorna um String
''' </summary>
''' <param name="query"></param>
''' <returns></returns>
Public Function MS_SQL_SRV_STR(query As String) As String
Erro = ""
Try
MS_SQL_SRV_CON()
Dim cmd = New SqlCommand(query, cncn)
cmd.CommandText = query
Return cmd.ExecuteScalar()
Catch ex As Exception
Erro = ex.Message
Return Nothing
'Throw ex
End Try
End Function
''' <summary>
''' executa um sql que retorna um single(sql)
''' </summary>
''' <param name="query"></param>
''' <returns></returns>
Public Function MS_SQL_SRV_Single(query As String)
Erro = ""
Try
MS_SQL_SRV_CON()
Dim cmd = New SqlCommand(query, cncn)
cmd.CommandText = query
Return cmd.ExecuteScalar()
Catch ex As Exception
Erro = ex.Message
Return Nothing 'erro
'Throw ex
End Try
End Function
''' <summary>
''' Executa uma procedure e retorna um dataset
''' Parametros = "P1,P2,P3,P4..."
''' </summary>
Public Function MS_SQL_SQL_Proc(Procedure As String, Parametros As String) As DataSet
Erro = ""
Try
Dim SQL As String = Procedure + " " + Parametros
Dim cmd As New SqlCommand(SQL, cncn)
Dim da As New SqlDataAdapter(cmd)
Dim ds As New DataSet()
da.Fill(ds)
Return ds
Catch ex As Exception
Erro = ex.Message
Return Nothing
'Throw ex
End Try
End Function
End Module
Auxiliares - Módulo Utilitarios
Module mdlUtilitarios
''' <summary>
''' Retorna true se o texto apresenta riscos de sql injection
''' </summary>
''' <param name="dado"></param>
''' <returns></returns>
Public Function VerificarSQLInjection(dado As String) As Boolean
Dim a As String
a = (dado).ToUpper
If InStr(a, "SELECT ") <> 0 Then Return True
If InStr(a, "INSERT ") <> 0 Then Return True
If InStr(a, "DELETE ") <> 0 Then Return True
If InStr(a, "UPDATE ") <> 0 Then Return True
If InStr(a, "DROP ") <> 0 Then Return True
If InStr(a, "TRUNCATE ") <> 0 Then Return True
If (InStr(a, "ALTER ") <> 0) And (InStr(a, "WALTER ") = 0) Then Return True
If InStr(a, "LIKE ") <> 0 Then Return True
If InStr(a, "%") <> 0 Then Return True
If InStr(a, "_") <> 0 Then Return True
Return False
End Function
''' <summary>
''' insere um elemento na cláusula where do sql
''' </summary>
''' <param name="sql"> é o sql a ser alterado</param>
''' <param name="cond"> condição a ser acrescentada (nome=x, tel=y</param>
''' <returns></returns>
Public Function insWhere(sql As String, cond As String)
Dim a As String
a = sql
If InStr(UCase(sql), "WHERE") <> 0 Then
a = a + " and " + cond
Else
a = a + " where " + cond
End If
Return a
End Function
''' <summary>
''' foi feita uma pesquisa e apenas um item foi encontrado
''' </summary>
Public Sub ExibirItem(sql As String)
Dim ds As New DataSet
ds = MS_SQL_SRV_DS(sql)
End Sub
End Module
Pagina Default.aspx
<%@ Page Title="Home Page" Language="VB" AutoEventWireup="true" CodeBehind="Default.aspx.vb" Inherits="_328_WebAppMaisSQLServer._Default" %>
<!DOCTYPE html>
<html lang="pt">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" type="text/css" href="Content/bootstrap.min.css">
<link rel="stylesheet" type="text/css" href="Content/Site.css">
<title><%: Page.Title %> - Meu web app ASP VB.NET com MS SQL SRV</title>
</head>
<body>
<form runat="server">
<div class="container body-content">
<div class="jumbotron">
<h1>Bem vindo a sua agenda pessoal</h1>
</div>
<div class="row">
<div class="col-md-3">
<h2>Consultar</h2>
<p>Esta funcionalidade permite consultar suas anotações na sua agenda.</p>
<p>
<a class="btn btn-default" href="Selecionar.aspx">Pesquisas »</a>
</p>
</div>
<div class="col-md-3">
<h2>Inserir</h2>
<p>Esta funcionalidade permite Inserir anotações da sua agenda</p>
<p>
<a class="btn btn-default" href="Inserir.aspx">Inserir »</a>
</p>
</div>
<div class="col-md-3">
<h2>Retirar</h2>
<p>Esta funcionalidade permite retirar anotações da sua agenda</p>
<p>
<a class="btn btn-default" href="retirar.aspx">Retirar »</a>
</p>
</div>
<div class="col-md-3">
<h2>Alterar</h2>
<p>Esta funcionalidade permite que você altere os dados da sua agenda</p>
<p>
<a class="btn btn-default" href="#">Alterar »</a>
</p>
</div>
</div>
</div>
</form>
</body>
</html>
Página de pesquisa - Selecionar.aspx
<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="Selecionar.aspx.vb" Inherits="_328_WebAppMaisSQLServer.Selecionar" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" type="text/css" href="Content/bootstrap.min.css" />
<link rel="stylesheet" type="text/css" href="Content/Site.css" />
<title><%: Page.Title %> - Pesquisa e Seleção</title>
</head>
<body>
<form id="form1" runat="server">
<div class="jumbotron">
<h3 style="text-align:center;">Agenda pessoal - Seleção de item - Pesquisa e Seleção</h3>
</div>
<div>
<asp:Label ID="lblmsg" runat="server" Text=""></asp:Label></div>
<div>
<div style="padding-left:30%;">
<table>
<tr>
<td>Nome : </td>
<td><asp:TextBox ID="txtNome" runat="server" Width="300px"></asp:TextBox></td>
</tr>
<tr><td> </td></tr>
<tr>
<td>Email : </td>
<td><asp:TextBox ID="txtEmail" runat="server" Width="300px"></asp:TextBox></td>
</tr>
<tr><td> </td></tr>
<tr>
<td>Telefone : </td>
<td><asp:TextBox ID="txtTelefone" runat="server" Width="300px"></asp:TextBox></td>
</tr>
<tr><td> </td></tr>
<tr>
<td><asp:Button ID="btnCancelar" runat="server" Text="Cancelar" /></td>
<td style="text-align:right;"><asp:Button ID="btnProsseguir" runat="server" Text="Prosseguir" /></td>
</tr>
</table>
</div>
</div>
</form>
</body>
</html>
Página de pesquisa - Selecionar.aspx.vb
Public Class Selecionar
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
End Sub
Protected Sub btnCancelar_Click(sender As Object, e As EventArgs) Handles btnCancelar.Click
Response.Redirect("Default.aspx")
End Sub
Protected Sub btnProsseguir_Click(sender As Object, e As EventArgs) Handles btnProsseguir.Click
Dim sql As String
Dim a As Integer
'corrigir : Parece que ao clicar em Retornar esta dando um postback no form o que
'faria inserir o mesmo usuário 2 vezes
'checando se os campos de pesquisa são válidos
If txtNome.Text = "" And txtEmail.Text = "" And txtTelefone.Text = "" Then
lblmsg.Text = "Os campos Nome, Email e Telefone estão em branco. Pesquisa cancelada."
lblmsg.ForeColor = Drawing.Color.Red
Exit Sub
End If
'trocando o caractere ' por ´
txtNome.Text = Replace(txtNome.Text, "'", "´")
txtEmail.Text = Replace(txtEmail.Text, "'", "´")
txtTelefone.Text = Replace(txtTelefone.Text, "'", "´")
'verificando sql injection
If VerificarSQLInjection(txtNome.Text) Then
lblmsg.Text = "Nome Inválido. Pesquisa cancelada."
lblmsg.ForeColor = Drawing.Color.Red
txtNome.Focus()
Exit Sub
End If
If VerificarSQLInjection(txtEmail.Text) Then
lblmsg.Text = "Email Inválido. Pesquisa cancelada."
lblmsg.ForeColor = Drawing.Color.Red
txtEmail.Focus()
Exit Sub
End If
If VerificarSQLInjection(txtTelefone.Text) Then
lblmsg.Text = "Telefone Inválido. Pesquisa cancelada."
lblmsg.ForeColor = Drawing.Color.Red
txtTelefone.Focus()
Exit Sub
End If
'tudo certo - podemos fazer a pesquisa
sql = "select count(*) from tblAgenda "
If txtNome.Text <> "" Then
sql = insWhere(sql, "Nome='" + txtNome.Text + "'")
End If
If txtEmail.Text <> "" Then
sql = insWhere(sql, "Email='" + txtEmail.Text + "'")
End If
If txtTelefone.Text <> "" Then
sql = insWhere(sql, "Telefone='" + txtTelefone.Text + "'")
End If
'executando o sql - verificando se vem só um registro ou muitos
a = MS_SQL_SRV_INT(sql)
If Erro <> "" Then
lblmsg.Text = Erro
Exit Sub
End If
Select Case a
Case 0
lblmsg.Text = "Não foi encontrado nenhum registro com os critérios apresentados."
lblmsg.ForeColor = Drawing.Color.Green
Exit Sub
Case 1
sql = Replace(sql, "select count(*)", "select * ")
ExibirItem(sql)
Case 2
'AdicionarASelecaoDeItens
End Select
End Sub
End Class
Página Inserir.aspx
<%@ Page Language="vb" AutoEventWireup="true" CodeBehind="Inserir.aspx.vb" Inherits="_328_WebAppMaisSQLServer.Inserir" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" type="text/css" href="Content/bootstrap.min.css" />
<link rel="stylesheet" type="text/css" href="Content/Site.css" />
<title><%: Page.Title %> - Inserção de nova Anotação</title>
</head>
<body>
<form id="frmInserirNovoItem" runat="server" method="post">
<div class="jumbotron">
<h3 style="text-align:center;">Agenda pessoal - Inserção de um novo item</h3>
</div>
<div>
<asp:Label ID="lblmsg" runat="server" Text=""></asp:Label>
</div>
<div style="padding-left:30%;">
<table>
<tr>
<td>Nome : </td>
<td><input type="text" name="txtNome" id="txtNome" style="width:300px" /></td>
</tr>
<tr><td> </td></tr>
<tr>
<td>Email : </td>
<td><input type="text" name="txtEmail" id="txtEmail" style="width:300px" /></td>
</tr>
<tr><td> </td></tr>
<tr>
<td>Telefone : </td>
<td><input type="text" name="txtTelefone" id="txtTelefone" style="width:300px" /></td>
</tr>
<tr><td> </td></tr>
<tr>
<td><asp:Button id="btnCancelar" runat="server" Text="Cancelar" /></td>
<td style="text-align:right;">
<asp:Button ID="btnInserir" runat="server" Text="Inserir" />
</td>
</tr>
</table>
</div>
</form>
</body>
</html>
Página Inserir.aspx.vb
Public Class Inserir
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim sql As String
If IsPostBack Then 'O PostBack é uma ação que ocorre em uma página enviando dados para o servidor
Dim nome As String = Request.Form("txtNome")
Dim Email As String = Request.Form("txtEmail")
Dim Telefone As String = Request.Form("txtTelefone")
'trocando o caractere ' por ´
nome = Replace(nome, "'", "´")
'verificando sql injection
If VerificarSQLInjection(nome) Then
lblmsg.Text = "Nome Inválido."
lblmsg.ForeColor = Drawing.Color.Red
Exit Sub
End If
If VerificarSQLInjection(Email) Then
lblmsg.Text = "Email Inválido."
lblmsg.ForeColor = Drawing.Color.Red
Exit Sub
End If
If VerificarSQLInjection(Telefone) Then
lblmsg.Text = "Telefone Inválido."
lblmsg.ForeColor = Drawing.Color.Red
Exit Sub
End If
sql = "insert into tblAgenda(Nome, Email, Telefone) Values ("
If nome <> "" Then
sql = sql + "'" + nome + "',"
Else
sql = sql + "null,"
End If
If Email <> "" Then
sql = sql + "'" + Email + "',"
Else
sql = sql + "null,"
End If
If Telefone <> "" Then
sql = sql + "'" + Telefone + "')"
Else
sql = sql + "null)"
End If
'inserindo no banco de dados
MS_SQL_SRV_EX(sql)
If Erro <> "" Then
lblmsg.Text = Erro
lblmsg.ForeColor = System.Drawing.Color.Red
Else
lblmsg.Text = "Anotação Inserida"
lblmsg.ForeColor = System.Drawing.Color.Green
End If
End If
End Sub
End Class
Falta terminar esta app